/**
 * 迭代器模式： 提供一种方法顺序访问一个聚合对象中的各个元素，而不暴露该对象的内部标识
 * 不用关心集合本身的内部结构及集合与集合之间的差异
 */

 // Array.prototype.forEach 只能用于数组的遍历
 // 以前使用 $.each 来对不同数据结构的集合进行遍历

 /**
  * Es6对迭代器的实现： for....of...针对Array，Map，Set，String，TypedArray，arguments， NodeList对象原生的数据结构都可以遍历
  * 任何数据结构具备Symbol.iterator属性，这个属性本质上是当前数据结构默认的迭代器生成函数，可以被遍历
  * for of 循环就是反复调用迭代器next方法
  * 
  */ 


// Es6 提供了生成器，可实现迭代器生成函数

// 编写一个迭代器生成函数
function *iteratorGenerator() {
    yield '1'
    yield '2'
    yield '3'
}
const iterator = iteratorGenerator();
iterator.next();
iterator.next();
iterator.next();

// 使用es5实现迭代器生成函数, 入参为任何集合
function iteratorGenerator1(list) {
    var idx = 0;
    var len = list.length;
    return {
        next: function() {
            // 如果索引还没有超出集合长度，为false
            var done = idx >= len;
            // 如果done为false，则可以继续取值
            var value = done ? undefined : list[idx++];
            return {
                done,
                value
            }
        }
    }
}
var set = new Set([1,3,4])
var it = iteratorGenerator1([1,3,4]);
console.log(it.next());
console.log(it.next());
console.log(it.next());